/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.cip.esymons.eventos.adapaters.CalendarioAmbientesAdapter;
import org.cip.esymons.eventos.adapaters.RutaCarpetaReporte;
import org.cip.esymons.eventos.bc.AmbienteDelegate;
import org.cip.esymons.eventos.bc.ContratoDelegate;
import org.cip.esymons.eventos.bc.DireccionPersonaDelegate;
import org.cip.esymons.eventos.bc.ReservaAmbienteDelegate;
import org.cip.esymons.eventos.bc.ServicioEquipoDelegate;
import org.cip.esymons.eventos.be.Ambiente;
import org.cip.esymons.eventos.be.Contrato;
import org.cip.esymons.eventos.be.ReservaAmbiente;
import org.cip.esymons.eventos.be.ServicioEquipo;
import org.cip.esymons.general.bc.PersonaJuridicaDelegate;
import org.cip.esymons.general.bc.PersonaNaturalDelegate;
import org.cip.esymons.general.bc.SolicitanteDelegate;
import org.cip.esymons.general.bc.TelefonoDelegate;
import org.cip.esymons.general.be.DireccionPersona;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.TelefonoSolicitante;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/**
 *
 * @author oscar
 */
public class ContratoController {

    ContratoDelegate delegate;
    Contrato contrato;
    Contrato contratoSeleccionado;
    List<Contrato> listaContrato;
    String tipo = "0";
    PersonaNatural perNatural;
    PersonaJuridica perJuridica;
    String telefono;
    String email;
    String direccion;
    String tipoAmbiente = "1";
    Ambiente ambiente;
    ServicioEquipo servicio;
    String ruc;
    Date fecha;
    ReservaAmbienteDelegate delegateReserva;
    List<Ambiente> listaReservaAmbientes;
    List<ServicioEquipo> listaReservaEquipos;
    List<ReservaAmbiente> listaReservasTemporal;
    AmbienteDelegate delegateAmbiente;
    ServicioEquipoDelegate delegateEquipo;
    SelectItem[] comboAmbiente;
    SelectItem[] comboEquipos;
    boolean var = false;
    int horaInicio = 14;
    int horaFin = 14;
    Double montoTotal = 0.0;
    Double montoSinDescuento = 0.0;
    Double descuentoPorcentaje = 0.0;
    Double subTotal;
    Double descuento = new Double(0);
    Double igv = new Double(9);
    String dni;
    Double garantia;
    int min = 7;
    int max = 24;
    PersonaJuridicaDelegate delegateJuridica;
    PersonaNaturalDelegate delegateNatural;
    String nombreEvento;
    List<CalendarioAmbientesAdapter> listaCalendario;
    List<CalendarioAmbientesAdapter> listaCalendario1;
    CalendarioAmbientesAdapter ambienteSeleccionado;
    String tipoDescuento = "0";//0=Porcentaje,1=Soles,2=Sin descuento

    public ContratoController() {
        inicializar();
    }

    public String inicializar() {
        delegate = new ContratoDelegate();
        contrato = new Contrato();
        contratoSeleccionado = new Contrato();
        listaContrato = new ArrayList<Contrato>();
        perNatural = new PersonaNatural();
        perJuridica = new PersonaJuridica();
        ambiente = new Ambiente();
        servicio = new ServicioEquipo();
        delegateReserva = new ReservaAmbienteDelegate();
        listaReservaAmbientes = new ArrayList<Ambiente>();
        listaReservasTemporal = new ArrayList<ReservaAmbiente>();
        listaReservaEquipos = new ArrayList<ServicioEquipo>();
        delegateAmbiente = new AmbienteDelegate();
        delegateEquipo = new ServicioEquipoDelegate();
        delegateJuridica = new PersonaJuridicaDelegate();
        delegateNatural = new PersonaNaturalDelegate();
        montoTotal = new Double(0);
        subTotal = new Double(0);
        listaCalendario1 = new ArrayList<CalendarioAmbientesAdapter>();
        listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
        listaContratosxAnular();
        return "";
    }

    //<editor-fold defaultstate="collapsed" desc="Gets y Sets">
    public Contrato getContrato() {
        return contrato;
    }

    public Contrato getContratoSeleccionado() {
        return contratoSeleccionado;
    }

    public void setContratoSeleccionado(Contrato contratoSeleccionado) {
        this.contratoSeleccionado = contratoSeleccionado;
    }

    public Double getGarantia() {
        return garantia;
    }

    public void setGarantia(Double garantia) {
        this.garantia = garantia;
    }

    public String getTipoDescuento() {
        return tipoDescuento;
    }

    public void setTipoDescuento(String tipoDescuento) {
        this.tipoDescuento = tipoDescuento;
    }

    public void setContrato(Contrato contrato) {
        this.contrato = contrato;
    }

    public Double getDescuentoPorcentaje() {
        return descuentoPorcentaje;
    }

    public void setDescuentoPorcentaje(Double descuentoPorcentaje) {
        this.descuentoPorcentaje = descuentoPorcentaje;
    }

    public Double getMontoSinDescuento() {
        return montoSinDescuento;
    }

    public void setMontoSinDescuento(Double montoSinDescuento) {
        this.montoSinDescuento = montoSinDescuento;
    }

    public CalendarioAmbientesAdapter getAmbienteSeleccionado() {
        return ambienteSeleccionado;
    }

    public void setAmbienteSeleccionado(CalendarioAmbientesAdapter ambienteSeleccionado) {
        this.ambienteSeleccionado = ambienteSeleccionado;
    }

    public List<CalendarioAmbientesAdapter> getListaCalendario() {
        return listaCalendario;
    }

    public void setListaCalendario(List<CalendarioAmbientesAdapter> listaCalendario) {
        this.listaCalendario = listaCalendario;
    }

    public List<CalendarioAmbientesAdapter> getListaCalendario1() {
        return listaCalendario1;
    }

    public void setListaCalendario1(List<CalendarioAmbientesAdapter> listaCalendario1) {
        this.listaCalendario1 = listaCalendario1;
    }

    public int getMin() {
        return min;
    }

    public void setMin(int min) {
        this.min = min;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max = max;
    }

    public Double getDescuento() {
        return descuento;
    }

    public void setDescuento(Double descuento) {
        this.descuento = descuento;
    }

    public String getNombreEvento() {
        return nombreEvento;
    }

    public void setNombreEvento(String nombreEvento) {
        this.nombreEvento = nombreEvento;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public Double getIgv() {
        return igv;
    }

    public void setIgv(Double igv) {
        this.igv = igv;
    }

    public Double getSubTotal() {
        return subTotal;
    }

    public void setSubTotal(Double subTotal) {
        this.subTotal = subTotal;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Double getMontoTotal() {
        return montoTotal;
    }

    public void setMontoTotal(Double montoTotal) {
        this.montoTotal = montoTotal;
    }

    public String getRuc() {
        return ruc;
    }

    public int getHoraFin() {
        return horaFin;
    }

    public void setHoraFin(int horaFin) {
        this.horaFin = horaFin;
    }

    public int getHoraInicio() {
        return horaInicio;
    }

    public void setHoraInicio(int horaInicio) {
        this.horaInicio = horaInicio;
    }

    public SelectItem[] getComboEquipos() {
        return comboEquipos;
    }

    public void setComboEquipos(SelectItem[] comboEquipos) {
        this.comboEquipos = comboEquipos;
    }

    public List<ReservaAmbiente> getListaReservasTemporal() {
        return listaReservasTemporal;
    }

    public void setListaReservasTemporal(List<ReservaAmbiente> listaReservasTemporal) {
        this.listaReservasTemporal = listaReservasTemporal;
    }

    public void setRuc(String ruc) {
        this.ruc = ruc;
    }

    public String getTipoAmbiente() {
        return tipoAmbiente;
    }

    public void setTipoAmbiente(String tipoAmbiente) {
        this.tipoAmbiente = tipoAmbiente;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public Ambiente getAmbiente() {
        return ambiente;
    }

    public void setAmbiente(Ambiente ambiente) {
        this.ambiente = ambiente;
    }

    public List<Ambiente> getListaReservaAmbientes() {
        return listaReservaAmbientes;
    }

    public void setListaReservaAmbientes(List<Ambiente> listaReservaAmbientes) {
        this.listaReservaAmbientes = listaReservaAmbientes;
    }

    public List<ServicioEquipo> getListaReservaEquipos() {
        return listaReservaEquipos;
    }

    public void setListaReservaEquipos(List<ServicioEquipo> listaReservaEquipos) {
        this.listaReservaEquipos = listaReservaEquipos;
    }

    public ServicioEquipo getServicio() {
        return servicio;
    }

    public void setServicio(ServicioEquipo servicio) {
        this.servicio = servicio;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public PersonaJuridica getPerJuridica() {
        return perJuridica;
    }

    public SelectItem[] getComboAmbiente() {
        return comboAmbiente;
    }

    public void setComboAmbiente(SelectItem[] comboAmbiente) {
        this.comboAmbiente = comboAmbiente;
    }

    public void setPerJuridica(PersonaJuridica perJuridica) {
        this.perJuridica = perJuridica;
    }

    public PersonaNatural getPerNatural() {
        return perNatural;
    }

    public void setPerNatural(PersonaNatural perNatural) {
        this.perNatural = perNatural;
    }

    public List<Contrato> getListaContrato() {
        return listaContrato;
    }

    public void setListaContrato(List<Contrato> listaContrato) {
        this.listaContrato = listaContrato;
    }
    // // </editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Validaciones">
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public boolean validarStrings(String s) {
        if (!s.equals("") && !s.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }

    public double redondear(double numero, int decimales) {
        return Math.round(numero * Math.pow(10, decimales)) / Math.pow(10, decimales);
    }

    public String limpiarBusquedas() {
        perNatural = new PersonaNatural();
        perJuridica = new PersonaJuridica();
        dni = null;
        telefono = null;
        direccion = null;
        email = null;
        ruc = null;
        return null;
    }

    // // </editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Buscar Ambientes/Equipos Disponibles">
    public String listarAmbientesEstado() {
        try {
            if (fecha.equals(null)) {
                mostrarMensaje("Error", "Selecciona una fecha para Buscar la Disponibilidad de los Ambientes", FacesMessage.SEVERITY_ERROR);
                return null;
            }
        } catch (Exception e) {
            mostrarMensaje("Error", "Selecciona una fecha para Buscar la Disponibilidad de los Ambientes", FacesMessage.SEVERITY_ERROR);
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH, -1);
        if (c.getTime().compareTo(fecha) <= 0) {
            try {
                List<ReservaAmbiente> listaReservas = new ArrayList<ReservaAmbiente>();
                listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
                listaReservas = delegateReserva.listarReserva_Dia(fecha, ambiente);
                //Cargar Ambientes
                for (int i = 7; i < 24; i++) {
                    int j;
                    var = true;
                    j = i + 1;
                    for (ReservaAmbiente res : listaReservas) {
                        if (res.getReahoraInicio() == i) {
                            var = false;
                        }
                    }
                    if (var) {
                        CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                        adap.setHoraInicio(new Double(i));
                        adap.setHoraFin(new Double(j));
                        adap.setHorario(i + ".00  - " + i + ".50");
                        adap.setEstado("RESERVAR");
                        adap.setHabilitado(true);
                        adap.setAmbiente(ambiente);
                        adap.setTipo(0);
                        adap.setNombre(ambiente.getAmbNombre());
                        adap.setCosto(ambiente.getAmbCosto());
                        listaCalendario.add(adap);
                    }
                }
            } catch (Exception e) {
                System.out.println("Errorrr " + e.toString());
            }
            return "";
        } else {
            listaCalendario.clear();
            mostrarMensaje("Error", "No puedes reservar Ambientes con fechas pasadas a la fecha de hoy", FacesMessage.SEVERITY_ERROR);
            return "";
        }
    }

    public String listarServiciosEstado() {
        try {
            if (fecha.equals(null)) {
                mostrarMensaje("Error", "Selecciona una fecha para Buscar la Disponibilidad de los Equipos", FacesMessage.SEVERITY_ERROR);
                return null;
            }
        } catch (Exception e) {
            mostrarMensaje("Error", "Selecciona una fecha para Buscar la Disponibilidad de los Equipos", FacesMessage.SEVERITY_ERROR);
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH, -1);
        if (c.getTime().compareTo(fecha) <= 0) {
            try {
                List<ReservaAmbiente> listaReservas = new ArrayList<ReservaAmbiente>();
                listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
                listaReservas = delegateReserva.listarReserva_Dia(fecha, servicio);
                //Cargar Ambientes
                for (int i = 7; i < 24; i++) {
                    int j;
                    var = true;
                    j = i + 1;
                    for (ReservaAmbiente res : listaReservas) {
                        if (res.getReahoraInicio() == i) {
                            var = false;
                        }
                    }
                    if (var) {
                        CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                        adap.setHoraInicio(new Double(i));
                        adap.setHoraFin(new Double(j));
                        adap.setHorario(i + ".00  - " + i + ".50");
                        adap.setServicio(servicio);
                        adap.setEstado("RESERVAR");
                        adap.setHabilitado(true);
                        adap.setTipo(1);
                        adap.setNombre(servicio.getSerNombre());
                        adap.setCosto(servicio.getSerCosto());
                        listaCalendario.add(adap);
                    }

                }
            } catch (Exception e) {
                System.out.println("Errorrr " + e.toString());
            }
        } else {
            mostrarMensaje("Error", "No puedes reservar Ambientes con fechas pasadas a la fecha de hoy", FacesMessage.SEVERITY_ERROR);
        }

        return "";
    }
    // // </editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Agregar/Quitar Ambientes/Equipos">
    public String agregarAmbSeleccionados() {
        for (CalendarioAmbientesAdapter cal : listaCalendario) {
            if (cal.getReservar()) {
                cal.setFecha(fecha);                
                listaCalendario1.add(cal);
                subTotal = subTotal + cal.getCosto();
            }
        }
        for (CalendarioAmbientesAdapter cal : listaCalendario1) {
            listaCalendario.remove(cal);
        }
        subTotal = redondear(subTotal, 2);
        return "";
    }

    public String quitarAmbSeleccionados() {
        try {
            listaCalendario.add(ambienteSeleccionado);
            listaCalendario1.remove(ambienteSeleccionado);
            subTotal = subTotal - ambienteSeleccionado.getCosto();
        } catch (Exception e) {
        }
        subTotal = redondear(subTotal, 2);
        return "";
    }
    // // </editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Buscar Contratante">
    public String buscarXDNI() {
        try {
            perNatural = new PersonaNatural();
            perNatural = delegateNatural.buscarXDNI(dni);
            try {//Buscar Direccion
                List<DireccionPersona> listaDirecciones = new ArrayList<DireccionPersona>();
                DireccionPersonaDelegate delegateTelefono = new DireccionPersonaDelegate();
                listaDirecciones = delegateTelefono.listaDirecciones(perNatural.getSolCodigo());
                direccion = listaDirecciones.get(0).getDpeDireccion();
            } catch (Exception ex) {
            }
            try {//Buscar Telefono
                List<TelefonoSolicitante> listaTelefonos = new ArrayList<TelefonoSolicitante>();
                TelefonoDelegate delegateTelefono = new TelefonoDelegate();
                listaTelefonos = delegateTelefono.buscarXSolicitante(perNatural.getSolCodigo());
                telefono = listaTelefonos.get(0).getTsoNumero();
            } catch (Exception ex) {
            }
            email = perNatural.getSolcorreopersonal1();
            ruc = perNatural.getSolRUC();
        } catch (Exception e) {
            //En caso de no econtrar la persona con el respectivo DNI
            limpiarBusquedas();
            mostrarMensaje("Error: ", "No existe ninguna Persona Registrada con ese Numero de DNI", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String buscarXRUC() {
        try {
            SolicitanteDelegate delegateSolicitante = new SolicitanteDelegate();
            if (tipo.equals("0")) {
                perNatural = new PersonaNatural();
                try {
                    Long lruc = delegateSolicitante.buscarxRuc(ruc);
                    perNatural = delegateNatural.buscarxId(lruc);
                    dni = perNatural.getPerNroDNI();
                    email = perNatural.getSolcorreopersonal1();
                    try {//Buscar Direccion
                        List<DireccionPersona> listaDirecciones = new ArrayList<DireccionPersona>();
                        DireccionPersonaDelegate delegateTelefono = new DireccionPersonaDelegate();
                        listaDirecciones = delegateTelefono.listaDirecciones(perNatural.getSolCodigo());
                        direccion = listaDirecciones.get(0).getDpeDireccion();
                    } catch (Exception ex) {
                    }
                    try {//Buscar Telefono
                        List<TelefonoSolicitante> listaTelefonos = new ArrayList<TelefonoSolicitante>();
                        TelefonoDelegate delegateTelefono = new TelefonoDelegate();
                        listaTelefonos = delegateTelefono.buscarXSolicitante(perNatural.getSolCodigo());
                        telefono = listaTelefonos.get(0).getTsoNumero();
                    } catch (Exception ex) {
                    }
                } catch (Exception e) {
                    limpiarBusquedas();
                    mostrarMensaje("Error: ", "No existe ninguna Persona con ese nÃƒÂºmero de RUC", FacesMessage.SEVERITY_ERROR);
                }
            } else {
                perJuridica = new PersonaJuridica();
                try {
                    Long lruc = delegateSolicitante.buscarxRuc(ruc);
                    perJuridica = delegateJuridica.buscarxId(lruc);
                    email = perJuridica.getSolcorreopersonal1();
                    try {//Buscar Direccion
                        List<DireccionPersona> listaDirecciones = new ArrayList<DireccionPersona>();
                        DireccionPersonaDelegate delegateTelefono = new DireccionPersonaDelegate();
                        listaDirecciones = delegateTelefono.listaDirecciones(perJuridica.getSolCodigo());
                        direccion = listaDirecciones.get(0).getDpeDireccion();
                    } catch (Exception ex) {
                    }
                    try {//Buscar Telefono
                        List<TelefonoSolicitante> listaTelefonos = new ArrayList<TelefonoSolicitante>();
                        TelefonoDelegate delegateTelefono = new TelefonoDelegate();
                        listaTelefonos = delegateTelefono.buscarXSolicitante(perJuridica.getSolCodigo());
                        telefono = listaTelefonos.get(0).getTsoNumero();
                    } catch (Exception ex) {
                    }
                } catch (Exception e) {
                    limpiarBusquedas();
                    mostrarMensaje("Error: ", "No existe ninguna Empresa con ese nÃƒÂºmero de RUC", FacesMessage.SEVERITY_ERROR);
                }
            }
        } catch (Exception e) {
            perNatural = new PersonaNatural();
            perJuridica = new PersonaJuridica();
            mostrarMensaje("Error: ", "No existe ninguna Persona/Empresa con ese nÃƒÂºmero de RUC", FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    // // </editor-fold>
    public void llenarDatosAntesVisualizar() {
        calcularMontos();
        for (int i = 0; i < listaCalendario1.size(); i++) {
            listaCalendario1.get(i).setIgv(igv);
            listaCalendario1.get(i).setApagar(montoTotal);
            listaCalendario1.get(i).setTotal(montoSinDescuento);
            listaCalendario1.get(i).setSubTotal(subTotal);
            listaCalendario1.get(i).setDireccion(direccion);
            listaCalendario1.get(i).setDescuento(0.0);
            listaCalendario1.get(i).setImporte(listaCalendario1.get(i).getCosto());
            if (tipoDescuento.equals("0") || tipoDescuento.equals("1")) {
                listaCalendario1.get(i).setDescuento(descuento);
            }
            if (tipo.equals("0")) {
                listaCalendario1.get(i).setNomContrante(perNatural.getPerapellidoPaterno() + " " + perNatural.getPerapellidoMaterno() + ", " + perNatural.getPerNombres());
                listaCalendario1.get(i).setTipoDocumento("DNI");
                listaCalendario1.get(i).setNroDocContratante(dni);
            } else {
                listaCalendario1.get(i).setNomContrante(perJuridica.getEmprazonSocial());
                listaCalendario1.get(i).setTipoDocumento("RUC");
                listaCalendario1.get(i).setNroDocContratante(ruc);
            }
        }
    }

    public String calcularMontos() {
        subTotal = montoTotal = montoSinDescuento = 0.0;
        for (CalendarioAmbientesAdapter cal : listaCalendario1) {
            subTotal = subTotal + cal.getCosto();
        }
        montoSinDescuento = subTotal * (1 + (igv / 100));
        if (tipoDescuento.equals("0")) {
            descuento = (montoSinDescuento * descuentoPorcentaje / 100);
            montoTotal = montoSinDescuento - descuento;
        } else {
            if (tipoDescuento.equals("1")) {
                montoTotal = montoSinDescuento - descuento;
            } else {
                montoTotal = montoSinDescuento;
            }
        }
        descuento = redondear(descuento, 2);
        subTotal = redondear(subTotal, 2);
        montoSinDescuento = redondear(montoSinDescuento, 2);
        montoTotal = redondear(montoTotal, 2);
        return "";
    }

    public String guardarContrato() {
        try {
            if (validarStrings(nombreEvento)) {
                if (listaCalendario1.size() > 0) {
                    //guardamos a las personas si no estan registradas en la BD
                    if (tipo.equals("0")) {
                        try {
                            if (perNatural.getSolCodigo() <= 0) {
                                delegateNatural.registrar(perNatural);
                            }
                        } catch (Exception e) {
                            delegateNatural.registrar(perNatural);
                        }
                    } else {
                        try {
                            if (perJuridica.getSolCodigo() <= 0) {
                                delegateJuridica.registrar(perJuridica);
                            }
                        } catch (Exception e) {
                            delegateJuridica.registrar(perJuridica);
                        }
                    }
                    contrato.setCodmontoTotal(montoSinDescuento);
                    contrato.setConApagar(montoTotal);
                    contrato.setConGarantia(garantia);
                    contrato.setConIGV(igv);
                    contrato.setConfechaContrato(new Date());
                    contrato.setConsubTotal(subTotal);
                    if (tipo.equals("0")) {
                        contrato.setConTipo(true);
                        contrato.setSolCodigo(perNatural);
                    } else {
                        contrato.setConTipo(false);
                        contrato.setSolCodigo(perJuridica);
                    }
                    if (tipoDescuento.equals("0") || tipoDescuento.equals("1")) {
                        contrato.setCondescuento(descuento);
                    } else {
                        contrato.setCondescuento(0.0);
                    }
                    contrato.setConEstado(1);//Sin Pagar
                    contrato.setConNombreEvento(nombreEvento);
                    delegate.guardar_Contrato(contrato);
                    //Guardamos la reserva de los ambientes
                    for (CalendarioAmbientesAdapter con : listaCalendario1) {
                        ReservaAmbiente res = new ReservaAmbiente();
                        if (con.getTipo() == 0) {
                            res.setAmbCodigo(con.getAmbiente());
                            res.setReaTipoae(0);
                        } else {
                            res.setSerCodigo(con.getServicio());
                            res.setReaTipoae(1);
                        }
                        res.setReaTipoec(1);//1=Contrato
                        res.setReaNombreEvento(nombreEvento);
                        res.setContrato(contrato);
                        res.setReaEstado("RESERVADO");
                        res.setReaFecha(con.getFecha());
                        res.setReahoraFin(con.getHoraInicio() + 1.0);
                        res.setReahoraInicio(con.getHoraInicio() + 0.0);
                        res.setReamontoParcial(con.getCosto());
                        delegateReserva.registrar(res);
                    }
                    cancelarContrato();
                    mostrarMensaje("Exito: ", "El contrato se realizó³ con exito", FacesMessage.SEVERITY_WARN);
                    listaContratosxAnular();
                    inicializar();
                } else {
                    mostrarMensaje("Error: ", "Busque y Seleccione un Ambiente/Equipo", FacesMessage.SEVERITY_ERROR);
                }
            } else {
                mostrarMensaje("Error: ", "Ingrese Nombre de Evento", FacesMessage.SEVERITY_ERROR);
            }
        } catch (Exception e) {
        }
        return "";
    }

    public String cancelarContrato() {
        try {
            contrato = new Contrato();
            fecha = null;
            var = false;
            perNatural = new PersonaNatural();
            perJuridica = new PersonaJuridica();
            ruc = null;
            dni = null;
            listaCalendario1 = new ArrayList<CalendarioAmbientesAdapter>();
            listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
            subTotal=montoTotal=descuento=descuentoPorcentaje=montoSinDescuento=0.0;
            inicializar();
        } catch (Exception e) {
        }

        return "";
    }

    @SuppressWarnings("static-access")
    public String visualizar() {
        llenarDatosAntesVisualizar();
        RutaCarpetaReporte ruta = new RutaCarpetaReporte();
        String rutaJasper = "", rutaPDF = "";
        rutaJasper = ruta.getRutaReporte() + "ContratoAmbienteEventos.jasper";
        rutaPDF = ruta.getRutaReporte() + "ContratoAmbienteEventos.pdf";
        for (int i = 0; i < listaCalendario1.size(); i++) {
            listaCalendario1.get(i).setConsejo(ruta.getConsejo());
        }
        try {
            File entrada = new File(rutaJasper);
            JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), null, new JRBeanCollectionDataSource(listaCalendario1));
            if (ruta.generarPDF(rutaPDF, print)) {
            }
        } catch (Exception e) {
            System.out.println("-------" + e.toString());
        }
        return "";
    }

    public String listaContratosxAnular(){
        try{
        listaContrato.clear();
        listaContrato=delegate.listarContratosxAnular();
        }catch(Exception e){
            
        }
        return null;
    }

    public String anularContrato(){
        try{
            contratoSeleccionado.setConEstado(0);
            delegate.actualizar_Contrato(contratoSeleccionado);
            listaContratosxAnular();
            inicializar();
            mostrarMensaje("Exito: ", "Se anulo el Contrato Nº "+contratoSeleccionado.getConNumero(), FacesMessage.SEVERITY_WARN);
        }catch(Exception e){

        }
        return null;
    }

}
